package com.spring.picture.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 设置 Key 的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        // 设置 Value 的序列化器
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        // 设置 Hash Key 的序列化器
        template.setHashKeySerializer(new StringRedisSerializer());
        // 设置 Hash Value 的序列化器
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());

        return template;
    }

    @Bean
    public JedisPool jedisPool() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();

        // 核心配置：检测连接有效性
        poolConfig.setTestOnBorrow(true);   // 借用连接时检测是否有效（关键配置）
        poolConfig.setTestOnReturn(true);   // 归还连接时检测是否有效（可选增强）
        //poolConfig.setTestWhileIdle(true);  // 空闲时检测连接有效性（配合下面的空闲时间配置）
        //poolConfig.setMinEvictableIdleTimeMillis(60000); // 最小空闲时间（1分钟），超过则可能被回收
        poolConfig.setTimeBetweenEvictionRunsMillis(-1); // 空闲连接检测间隔（30秒）

        // 配置连接池参数（可选，使用默认值即可）
        poolConfig.setMaxTotal(100);        // 最大连接数
        poolConfig.setMaxIdle(10);          // 最大空闲连接数
        poolConfig.setMinIdle(5);           // 最小空闲连接数

        // 创建 JedisPool
        return new JedisPool(poolConfig, host, port);
    }
}